home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagn_r.zip / NUMBERS.SWG / 0016_RANDOM2.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  2KB  |  64 lines

  1. { MR> I have started playing With Borland Turbo Pascal 7.0 and I have a
  2.  MR> problem. The Random routine is not the same as the one in TP 6.0.
  3.  MR> Using the same RandSeed, they generate different series of numbers.
  4.  MR> I have a couple of applications that depend upon the number series
  5.  MR> generated by the TP 6.0 version. Can anyone supply me With the
  6.  MR> algorithm used in the TP 6.0 Random routine? or maybe point me in
  7.  MR> the right direction? I want to Construct my own TP 7 Random routine
  8.  MR> that will behave as the one in TP 6.
  9.  
  10. The way both generators work is to update System.Randseed, then calculate the
  11. new random value from that one.  There have been several different ways to
  12. calculate the value; I think TP 6 is different from TP 5.5, and TP 7 is
  13. different again.  The update algorithm has been pretty Constant.
  14.  
  15. As I recall, you can simulate the TP 6 Random(N) Function in TP 7 as follows:
  16. }
  17. Function TP6Random(N:Word):Word;
  18. Var
  19.   junk : Word;
  20.   myrandseed : Record
  21.   lo, hi : Word
  22.   end Absolute system.randseed;
  23. begin
  24.   junk := Random(0);   { Update Randseed }
  25.   TP6Random := myrandseed.hi mod N;
  26. end;
  27.  
  28. {
  29. You might want to keep the following around in Case the update algorithm gets
  30. changed sometime in the future:
  31.  
  32. Demonstration Program to show how the TP 6.0 random number generator
  33. updates System.Randseed.  Allows the seed to be cycled backwards. }
  34.  
  35. Procedure CycleRandseed(cycles:Integer);
  36. { For cycles > 0, mimics cycles calls to the TP random number generator.
  37.   For cycles < 0, backs it up the given number of calls. }
  38. Var
  39.   i : Integer;
  40. begin
  41.   if cycles > 0 then
  42.     For i := 1 to cycles do
  43.       system.randseed := system.randseed*134775813 + 1
  44.   else
  45.     For i := -1 downto cycles do
  46.       system.randseed := (system.randseed-1)*(-649090867);
  47. end;
  48.  
  49. Var
  50.   i : Integer;
  51. begin
  52.   randomize;
  53.   Writeln('Forwards:');
  54.   For i:=1 to 5 do
  55.     Writeln(random);
  56.   Writeln('Backwards:');
  57.   For i:=1 to 5 do
  58.   begin
  59.     CycleRandseed(-1);    { Back to previous value }
  60.     Writeln(random);      { Show it }
  61.     CycleRandseed(-1);    { Back up over it again }
  62.   end;
  63. end.
  64.